"""
caoyunkun c00374052对所有人说说： 05:19 PM
数组子集排列组合统计
1	总体说明
给定一个可能包含重复元素的字符数组 chars，返回该数组所有可能的子集的排列组合数。
本次考试主要考察知识点有树结构、回溯算法、递归等。
1.1	计算规则
字符数组	排列组合	结果
XXY	XX, XY, XYX, X, XXY, YXX, Y, YX	8

XYZ	XY, YZ, XZ, XZY, YZX, X, XYZ, ZYX, Y, YXZ, Z, ZXY, ZX, YX, ZY	15
2	操作说明
功能说明:
给定一个可能包含重复元素的字符数组 chars，返回该数组所有可能的子集的排列组合数。

参数说明：
String str [字符数组] 1 <= str.length() <= 7

     输出说明：
int num 所有可能的子集的排列组合数。

编号	测试用例	输入	输出
		字符串
1	XXY	XXY	8
2	XYZ	XYZ	15
3	XXYY	XXYY	18
	XYXZX	XYXZX	63
4	XXXYYZ	XXXYYZ	188


"""


def get_all_permutations(my_str):
    ...
    my_str = list(my_str)
    result = list()
    tmp_result = ""
    backtracking(result, tmp_result, my_str, 0, len(my_str) - 1)
    return len(result)


def backtracking(result, tmp_result, my_str, location, max_len):
    ...
    if tmp_result != "" and tmp_result not in result:
        result.append(tmp_result[:])
    if location > max_len:
        return

    #  print(my_str, location, result)
    for single_str in my_str:
        tmp_result += single_str
        tmp_str = my_str[:]
        tmp_str.remove(single_str)
        backtracking(result, tmp_result, tmp_str, location + 1, max_len)
        tmp_result = tmp_result[:-1]


if __name__ == "__main__":
    my_str = ["xxy", "xyz", "xxyy", "xyxzx", "xxxyyz"]
    #  1	XXY	XXY	8
    #  2	XYZ	XYZ	15
    #  3	XXYY	XXYY	18
    #  XYXZX	XYXZX	63
    #  4	XXXYYZ	XXXYYZ	188
    for every_str in my_str:
        print(f"str:{every_str}, nums: {get_all_permutations(every_str)}")
